package com.saydc.forms.incorporaciones;

import java.text.SimpleDateFormat;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.hibernate.Session;

import com.saydc.dao.EmpleadosDAO;
import com.saydc.dao.ExpertiseDAO;
import com.saydc.dao.PuestosDAO;
import com.saydc.model.PuestoEspecifico;
import com.saydc.utils.HibernateUtils;

public class IncorporaEmpleadoForm extends ActionForm {

	private final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	
	private static final long serialVersionUID = 1L;
	private String legajo;
	private String nombre;
	private int puestoEspecifico;
	private int expertise;
	private String remuneracion;
	private String fechaIngreso;
	
	public String getLegajo() {
		return legajo;
	}
	public void setLegajo(String legajo) {
		this.legajo = legajo;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public int getPuestoEspecifico() {
		return puestoEspecifico;
	}
	public void setPuestoEspecifico(int puestoEspecifico) {
		this.puestoEspecifico = puestoEspecifico;
	}
	public int getExpertise() {
		return expertise;
	}
	public void setExpertise(int expertise) {
		this.expertise = expertise;
	}
	public String getRemuneracion() {
		return remuneracion;
	}
	public void setRemuneracion(String remuneracion) {
		this.remuneracion = remuneracion;
	}
	public String getFechaIngreso() {
		return fechaIngreso;
	}
	public void setFechaIngreso(String fechaIngreso) {
		this.fechaIngreso = fechaIngreso;
	}
	
	@Override
	public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
		ActionErrors errors = new ActionErrors();
		if(legajo == null || legajo.length() != 8){
			errors.add("legajoRequerido", new ActionMessage("error.incorporacion.legajoInvalido"));
		}else if(existeLegajo(legajo) == true){
			errors.add("legajoRequerido", new ActionMessage("error.incorporacion.legajoRegistrado"));
		}
		if(nombre == null || nombre.length() < 1){
			errors.add("nombreRequerido", new ActionMessage("error.incorporacion.nombreRequerido"));
		}
		if(puestoEspecifico == -1){
			errors.add("puestoRequerido", new ActionMessage("error.incorporacion.puestoRequerido"));
		}
		if(expertise == 0){
			errors.add("expertiseRequerido", new ActionMessage("error.incorporacion.expertiseRequerido"));
		}
		if(isExpertiseAsociado(puestoEspecifico, expertise) == false){
			errors.add("expertiseAsociado", new ActionMessage("error.incorporacion.expertiseAsociado"));
		}
		if(remuneracion == null || numeroValido(remuneracion) == false){
			errors.add("remInvalida", new ActionMessage("error.incorporacion.valorInvalido"));
		}
		if(remuneracionFueraDeRango(remuneracion) == true){
			errors.add("rangoRemuneracion", new ActionMessage("error.incorporacion.rangoRemuneracionInvalida"));
		}
		if(fechaIngreso == null || fechaValida(fechaIngreso) == false){
			errors.add("fechaInvalida", new ActionMessage("error.incorporacion.fechaInvalida"));
		}
		return errors;
	}
	
	private boolean existeLegajo(String legajo) {
		EmpleadosDAO dao = EmpleadosDAO.getInstance();
		if(dao.buscarEmpleadoPorLegajo(legajo) == null){
			return false;
		}
		return true;
	}
	private boolean fechaValida(String fecha){
		try{
			sdf.parse(fecha);
		}catch(Exception e){
			return false;
		}
		return true;
	}
	
	private boolean numeroValido(String valor){
		try{
			Double.parseDouble(valor);
		}catch(Exception e){
			return false;
		}
		return true;
	}
	
	private boolean remuneracionFueraDeRango(String valor){
		double remuneracion = Double.parseDouble(valor);
		PuestosDAO dao = PuestosDAO.getInstance();
		Session session = HibernateUtils.currentSession();
		PuestoEspecifico especifico = dao.getPuestoEspecifico(session, puestoEspecifico);
		if(remuneracion < especifico.getRemuneracionMinima() || remuneracion > especifico.getRemuneracionMaxima()){
			return true;
		}
		return false;
	}
	
	private boolean isExpertiseAsociado(int idPuesto, int idExpertise){
		PuestosDAO dao = PuestosDAO.getInstance();
		Session session = HibernateUtils.currentSession();
		PuestoEspecifico especifico = dao.getPuestoEspecifico(session, puestoEspecifico);
		ExpertiseDAO expDao = ExpertiseDAO.getInstance();
		if(especifico.getExpertiseRequerido().contains(expDao.getExpertiseFromLista(expDao.getExpertises(), idExpertise))){
			return true;
		}
		return false;
	}
	
}
